今天剛好在 X 看到有人出問題
請解釋下面的 code 為何不能 compile
最後作者拋出 swift 文件 Capture List
過程中
也順便解了 struct 被 implict capture
之後,
後續會發生什麼的問題
[a]
先來談談 [a]
,他的作用類似於在 inner scope let innerA = outerA
因此 innerA
和 outerA
是兩個不同的個體
b
b 的話則會 ref 到原本的 outerB
因此整份 code 其實只有一個 b
final func testStructCaptureList() {
var a = 0
var b = 0
let closure = { [a] in
return (a, b)
}
a = 10
b = 10
let (na, nb) = closure()
XCTAssertEqual(na, 0)
XCTAssertEqual(nb, 10)
}
class 的情況不管是 Explicit
/Implicit
capture
其結果都是一樣的
(內心 OS 一下,還以為前面的等價 code 都寫錯了)
class SimpleClass {
var value: Int = 0
}
func testClassCaptureList() {
var x = SimpleClass()
var y = SimpleClass()
let closure = { [x] in
return (x.value, y.value)
}
x.value = 10
y.value = 10
let (na, nb) = closure()
XCTAssertEqual(na, 10)
XCTAssertEqual(nb, 10)
}